#ifndef substr_range_HPP__
#define substr_range_HPP__

#include "string.hpp"
//#include "string_range.hpp"


//TODO: no es un tipo de rango, sino una funcion helper que obtiene un Range correspondiente al substr

namespace boost {
namespace container {



//typename StringType::const_range substr_range( StringType const& str, typename StringType::size_type pos, typename StringType::size_type n )


//TODO: size_type pos = 0, size_type n = npos)

template <typename StringType>
auto substr_range( StringType const& str, typename StringType::size_type pos, typename StringType::size_type n ) -> decltype( str.all() )
{
	if ( pos > str.size() )
	{
		throw(std::out_of_range("substr_range"));
	}

	//using range_type = decltype( str.all() );
	typedef decltype( str.all() ) range_type;

	//TODO: container_detail::min_value o std::min

	return range_type(
			str.begin() + pos, 
			str.begin() + pos + container_detail::min_value(n, str.size() - pos)
			);
}


} //namespace container {
} // namespace boost {


#endif // substr_range_HPP__